'''
' 闭包/装饰器
1 函数的嵌套
    外函数
      内函数
 2 内部函数使用外部函数作用域的变量
 3 外部函数要有返回值，返回内部函数名
'''

def func_out(func):
  def func_in(*args, **kwargs):
    print('新增功能')
    return func(*args, **kwargs)
  return func_in


def test():
  print("测试函数")

@func_out
def test2():
  print("测试函数2")

'''
' 类装饰器
'''
class TestCls():
  def __init__(self, func):
    print('TestCls __init__ ')
    self.func = func
    self.func()
  #  让类可调用
  def __call__(self, *args, **kwargs):
    pass # 解决TypeError: 'TestCls' object is not callable


@TestCls
# 等于 test = TestCls(test3)
def test3():
  print("测试函数3")


if __name__ == '__main__':
  # test()
  # test2()
  test3() # TypeError: 'TestCls' object is not callable
